// 装饰器 --> 面向对象中的概念
// java --> 注解    c# --> 特性    TS --> 装饰器
// 装饰器是 javascript 本身就支持的内容
// ES6 提出装饰器提案  --> 2024 stage-3
// react18    vue3
// webpack5   vite

// 支持装饰器的有
// AngularJS    nodejs后端框架NestJS    鸿蒙

// 装饰器模式 --> 结构设计模式
// 装饰器模式通过将对象置于包含行为的特殊包装器对象中, 可以将新的行为附加到对象上

// 装饰器模式在架构上来说, 有时候还不够方便
class User {
  // @required
  // @range(3, 5)
  // @description('账号')
  loginId: string;  // 必须是3-5个字符, 必填
  loginPwd: string; // 必须是6-12个字符, 必填
  age: number;  // 必须是0-100之间的数字
  gender: "男" | "女";

  validateUser() {
    // 对账号进行验证
    // 对密码进行验证
    // 对年龄进行验证
    // ...
  }
}

const u = new User();

// function validateUser(user: User) {
//   // 对账号进行验证
//   // 对密码进行验证
//   // 对年龄进行验证
//   // ...
// }

// 1. 关注点分离
// 2. 代码重复

// 这两个问题产生的根源: 就是我们在定义某些信息时候, 能够附加的信息有限
// 如果能给这些信息装饰一下, 添加上有用的信息, 就可以处理了, 这就是装饰器

// 装饰器的作用: 为某些属性, 方法(方法参数), 类提供元数据信息(metadata)
// 元数据: 描述数据的数据